package br.com.localab.contador.modelo;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Restrictions;

public class RepositorioContador implements IRepositorioContador, Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Session s;
	
	public RepositorioContador(Session s) {
		this.s = s;
	}
	
	public void cadastrarContador(Contador contador) throws ContadorJaCadastradoException{
		try{
			s.save(contador);
		}catch(Exception e){
		  throw	new ContadorJaCadastradoException(contador.getContador_PK().toString());
		}
	}
	
	public void editarContador(Contador contador) throws ContadorNaoEncontradoException{
		try{
			s.update(contador);
		}catch(Exception e){
		  throw	new ContadorNaoEncontradoException(contador.getContador_PK().toString());
		}
	}
	
	public Contador procurar(Contador_PK contador_PK) throws ContadorNaoEncontradoException{
		Contador contador;
		try{
			contador  = (Contador) s.load(Contador.class, contador_PK);
			System.out.println(contador.getContador_PK().toString());
		return contador;
		}catch(Exception e){
			throw new ContadorNaoEncontradoException(contador_PK.toString());
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Contador> listar(){
		return s.createCriteria(Contador.class).list();
	}
	
	@SuppressWarnings("unchecked")
	public List<Contador> listar(String nomeCampo, boolean valorCampo) {
		Criteria c = s.createCriteria(Contador.class);
		c.add(Expression.eq(nomeCampo, valorCampo));
		c.setCacheable(false);
		return c.list();
	}
	
	public Contador procurar(String nomeCampo, String valorCampo) throws ContadorNaoEncontradoException{
		try{
		Criteria c = s.createCriteria(Contador.class);
		c.add(Expression.eq(nomeCampo, valorCampo));
		c.setCacheable(true);
		Contador contador = (Contador) c.uniqueResult();
		System.out.println(contador.getContador_PK().toString());
		return contador;
		}catch(Exception e){
			throw new ContadorNaoEncontradoException(valorCampo);
		}
	}

	@Override
	public void removerContador(
			Contador contador)
			throws ContadorNaoEncontradoException {
		try{
			s.delete(contador);
		}catch(Exception e){
		  throw	new ContadorNaoEncontradoException(contador.getContador_PK().toString());
		}
		
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Contador> listar(String nomeCampo, Long valorCampo) {
		Criteria c = s.createCriteria(Contador.class);
		c.add(Expression.eq(nomeCampo, valorCampo));
		c.setCacheable(false);
		return c.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Contador> listar(String nomeCampo, Long valorCampo,
			String nomeCampo2, int valorCampo2) {
		Criteria c = s.createCriteria(Contador.class);
		c.add(Expression.eq(nomeCampo, valorCampo));
		c.add(Expression.eq(nomeCampo2, valorCampo2));
		c.setCacheable(false);
		return c.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Contador> listar(String nomeCampo, Long valorCampo,
			String nomeCampo2, String valorCampo2) {
		Criteria c = s.createCriteria(Contador.class);
		c.add(Expression.eq(nomeCampo, valorCampo));
		c.add(Restrictions.not(Expression.eqProperty(nomeCampo2, valorCampo2)));
		c.setCacheable(true);
		return c.list();
	}

	
}
